package gruppoSoluzione.mainService;

import java.util.Collection;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;


/**
 * Il Database completo del servizio Web
 * 
 * @author Alessandro Martinelli
 */
public class ServiceDB {

	private TreeMap<ServiceDate, TreeSet<ServiceDBLog>> db=new TreeMap<ServiceDate, TreeSet<ServiceDBLog>>();
	
	private TreeSet<String> operatori=new TreeSet<String>();
	 
	/**
	 * Restituisce l'insieme di tutte le date per le quali esistono log in questo database
	 */
	public Set<ServiceDate> getServiceDates(){
		return db.keySet();
	}
	
	/**
	 * Restituisce un iteratore ai log associati ad una certa data
	 */
	//NOTA:: stiamo cercando id incapsulare il più possibile l'implementazione del db, cioè l'attributo 'db'
	//questo da alcuni benefici, come ad esempio il corretto funzionamento di getOperatori
	public Iterable<ServiceDBLog> getLogsIterable(ServiceDate date){
		return db.get(date);
	}
	
	/**
	 * Aggiunge un log in corrispondenza ad una certa data,
	 * a prescindere che per quella data esistano già ulteriori log nel db.
	 * @param date
	 * @param log
	 */
	public void addLog(ServiceDate date,ServiceDBLog log){
		TreeSet<ServiceDBLog> dailyDatabase = checkMap(date);
		dailyDatabase.add(log);
		operatori.add(log.getOperatore());
	}

	/**
	 * Aggiunge più log in corrispondenza ad una certa data,
	 * a prescindere che per quella data esistano già ulteriori log nel db.
	 * @param date
	 * @param log
	 */
	public void addLogs(ServiceDate date,Collection<ServiceDBLog> log){
		TreeSet<ServiceDBLog> dailyDatabase = checkMap(date);
		dailyDatabase.addAll(log);
		for (ServiceDBLog serviceDBLog : dailyDatabase) {
			operatori.add(serviceDBLog.getOperatore());	
		}
	}

	/**
	 * Resituisce l'elenco di tutti gli operatori
	 * @return
	 */
	public Set<String> getOperatori(){
		return operatori;
	}
	
	private TreeSet<ServiceDBLog> checkMap(ServiceDate date) {
		TreeSet<ServiceDBLog> dailyDatabase=db.get(date);
		if(dailyDatabase==null){
			dailyDatabase=new TreeSet<ServiceDBLog>();
			db.put(date, dailyDatabase);
		}
		return dailyDatabase;
	}
	
}
